#!/bin/bash
# redis配置
# author    : guyadong
# date      : 2019/08/01
# 导入标志,确保只会被导入一次
redis_config_included=true
# 脚本初始化
[ "$common_init_included" != 'true' ] && . ./common_init.sh
rediscfg_title='redis配置'

service_online redis $DEFAULT_REDIS_PORT $redis_port

function fun_redis_use_local(){    
    [ $context_redis_configured -eq 0 ] && [ $context_last_code -ne 3 ] && return 4
    [ $context_redis_configured -eq 0 ] && [ $context_last_code -eq 3 ] && return 3
    local defaultno=    
    [ "$redis_use_local" = 1 ] && defaultno='--defaultno'

    dialog  --backtitle "$DEFAULT_BACK_TITLE$context_backtitle_suffix" $DLG_YESNO_LABEL \
            --title "$rediscfg_title" $DLG_BACK_BTN $defaultno \
            --yesno "是否使用本地 redis 服务?" 5 30
    local code=$?
    [ $code -lt 2 ] && redis_use_local=$code
    return $code
}

# 检查连接参数是否有无效值,有则返回-1,无则返回0
# $1 $host
# $2 $port
# $3 $password
# #4 $database
function _check_redis_params(){
    [[ ! "$1" =~ ^[A-Za-z0-9_\.]+$ ]] && error_message "主机名(host)无效" && return 255
    [[ ! "$2" =~ ^[0-9]{1,5}$      ]] && error_message "端口号(port)不可为空,必须为数字" && return 255
    [[ ! "$3" =~ ^[A-Za-z0-9]+$ ]] && error_message "密码(password)不可为空,字符范围：字母数字" && return 255
    [[ ! "$4" =~ ^[0-9]{1,2}$      ]] && error_message "数据库索引(database)无效,有效值0～15" && return 255
    return 0
}

# 输出 redis 连接参数值
function output_redis_params(){
    echo redis_host=$redis_host
    echo redis_port=$redis_port
    echo redis_password=$redis_password
    echo redis_database=$redis_database
}
# 设置 redis 连接参数
# 从 redis_host redis_port 等指向的变量名中读取连接参数作为默认输入
# 对话框结束时回写到对应的变量
# 如果参数无效则一直循环,如果点返回则跳出循环返回3,否则返回0
function fun_redis_connect(){
    local host="$redis_host"
    local port="$redis_port"
    local password="$redis_password"
    local database="$redis_database"
    while true  ; 
    do 
        # 保存对话框选项的值到$values,如果对话框选项返回,则$values值为'EXIT_$?'
        local values=$(dialog \
            --backtitle "$DEFAULT_BACK_TITLE$context_backtitle_suffix" \
            --title '配置 redis 连接参数' $DLG_BACK_BTN --nocancel \
            --form "请输入redis连接的参数:" 15 66 0 \
                "主机名(host)        :"  1 1 "$host" 	    1 24 34 0 \
                "端口号(port)        :"  2 1 "$port"        2 24 34 0 \
                "密码(password)      :"  3 1 "$password"    3 24 34 0 \
                "数据库索引(database):"  4 1 "$database"    4 24 34 0 \
                3>&1 1>&2 2>&3 || echo EXIT_$?)
        
        [[ "$values" =~ EXIT_[0-9] ]] && return ${values##*EXIT_}
        host="$(echo      "$values" | sed -n 1p)"
        port="$(echo      "$values" | sed -n 2p)"
        password="$(echo  "$values" | sed -n 3p)"
        database="$(echo  "$values" | sed -n 4p)"
        ! _check_redis_params "$host" "$port" "$password" "$database" && continue
        # 按确认按钮时将对话框返回值分别保存到对应的变量中
        redis_host="$host"
        redis_port="$port"
        redis_password="$password"
        redis_database="$database"
        context_redis_configured=0
        return 0
    done
}

function fun_local_redis_connect(){
    [ -z "$redis_host" ] && redis_host=$DEFAULT_REDIS_HOST
    [ $redis_online -eq 0 ] && redis_port=$redis_online_port
    # 没有指定密码时生成随机密码
    [ -z "$redis_password" ] && redis_password="$(date +%s | md5sum | base64 | head -c 8)"
    fun_redis_connect
}
function fun_remote_redis_connect(){    
    [ "$redis_host" == $DEFAULT_REDIS_HOST ] && redis_host=
    fun_redis_connect
}

# 返回 redis_host redis_port redis_password redis_database 参数组成的 URI (jedis://)
function make_jedis_uri(){
    echo "jedis://:$redis_password@$redis_host:$redis_port/$redis_database"
}
# 返回 redis_host redis_port redis_password redis_database 参数组成的 URI (redis://)
function make_redis_uri(){
    echo "redis://:$redis_password@$redis_host:$redis_port/$redis_database"
}

#fun_redis_connect
#output_redis_params
